/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.sep.gestores;

import edu.ucue.sep.controller.PaqueteJpaController;
import edu.ucue.sep.controller.PersonaJpaController;
import edu.ucue.sep.controller.SucursalJpaController;
import edu.ucue.sep.model.DetallePaquete;
import edu.ucue.sep.model.Observacion;
import edu.ucue.sep.model.Paquete;
import edu.ucue.sep.model.Persona;
import edu.ucue.sep.model.Sucursal;
import edu.ucue.sep.model.Ubicacion;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author Martha
 */
@ManagedBean(name = "paqueteManager")
@SessionScoped
public class PaqueteManager {
    
    private Date fecha;
    private String estado;
    private String trackingCode;
    private String numCard;
    private String tipoCard;
    private double subtotal;
    private double valIVA;
    private double  total;
    private List<DetallePaquete> detalles;
    private Ubicacion ubicaciones;
    private Observacion observaciones;
    private Persona emisor;
    private Persona receptor;
    private Sucursal desde;
    private Sucursal hacia;
    private boolean tarjeta;
    private String observacion;
    
    //DETALLE
    private String detalleDescripcion;
    private int detalleCantidad;
    private double detalleLargo;
    private double detalleAncho;
    private double detalleProfundidad;
    private double detallePeso;
    private double detallePrecio;
    private double detalleTotal;
    
    private PaqueteJpaController pjpa;
    
     public static PaqueteManager getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{paqueteManager}", PaqueteManager.class);
        return (PaqueteManager) ex.getValue(context);
    }
     
     public void init(){
         Date fecha=new Date();
        estado="";
        trackingCode="";
        numCard="";
        tipoCard="";
        subtotal=0;
        valIVA=0;
        total=0;
        detalles=new ArrayList<DetallePaquete>();
        ubicaciones=new Ubicacion();
        observaciones=new Observacion();
        emisor= new Persona();
        receptor=new Persona();
        desde=new Sucursal();
        hacia=new Sucursal();
        tarjeta=false;
        observacion="";
        initDetalle();
     }

    public void initDetalle(){
        detalleDescripcion="";
        detalleCantidad=0;
        detalleLargo=0;
        detalleAncho=0;
        detalleProfundidad=0;
        detallePeso=0;
        detallePrecio=0;
        detalleTotal=0;
    }
     
    public String buscarPersona(int i){
        List<Persona> personas=new ArrayList<Persona>();
        pjpa=new PaqueteJpaController();
        PersonaJpaController perjpa=new PersonaJpaController();
        if (i==1){
            personas=perjpa.findPersonaEntitiesWhere("where o.cedula='"+emisor.getCedula()+"'");
            if (personas.isEmpty() || personas==null){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "El cliente no está registrado"));
                return "";
            }
            emisor=personas.get(0);
            return "";
        }
        else{
            personas=perjpa.findPersonaEntitiesWhere("where o.cedula='"+receptor.getCedula()+"'");
            if (personas.isEmpty() || personas==null){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "La persona no está registrada"));
                return "";
            }
            receptor=personas.get(0);
            return "";
        }
    }
    
    public String guardarEmisor(){
        if (emisor!=null && emisor.getIdPersona()==0){
            if (emisor.getApellido().equals("") || emisor.getCedula().equals("") || emisor.getDireccion().equals("") || emisor.getEmail().equals("")){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Faltan datos por completar"));
                return "";
            }
            PersonaJpaController perjpa=new PersonaJpaController();
            List<Persona> personas=perjpa.findPersonaEntitiesWhere("where o.cedula='"+emisor.getCedula()+"'");
            if (personas.isEmpty()){
                emisor.setUsuario(null);
                try{
                    perjpa.create(emisor);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
        return "";
    }
    
    public String guardarReceptor(){
        if (receptor!=null && receptor.getIdPersona()==0){
            if (receptor.getApellido().equals("") || receptor.getCedula().equals("") || receptor.getDireccion().equals("") || receptor.getEmail().equals("")){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Faltan datos por completar"));
                return "";
            }
            PersonaJpaController perjpa=new PersonaJpaController();
            List<Persona> personas=perjpa.findPersonaEntitiesWhere("where o.cedula='"+receptor.getCedula()+"'");
            if (personas.isEmpty()){
                receptor.setUsuario(null);
                try{
                    perjpa.create(receptor);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
        return "";
    }
    
    public String buscarDesde(){
        SucursalJpaController sjpa=new SucursalJpaController();
        if (desde.getIdScursal()!=0){
            Sucursal suc1=sjpa.findSucursal(desde.getIdScursal());
            if (suc1==null){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "La sucursal con dicho id no existe"));
            }
            else{
                desde=suc1;
                int band=0;
                while (band==0){
                    int idsuc=desde.getIdScursal();
                    int ramd=(int)Math.random()*1000000000;
                    String trac=String.valueOf(idsuc)+String.valueOf(ramd);
                    List<Paquete> paqu=pjpa.findPaqueteEntitiesWhere("where o.trackingCode='"+trac+"'");
                    if (paqu.isEmpty() || paqu==null){
                        trackingCode=trac;
                        band=1;
                    }
                }
            }
        }
        return "";
    }
    
    public String buscarHacia(){
        SucursalJpaController sjpa=new SucursalJpaController();
        if (hacia.getIdScursal()!=0){
            Sucursal suc1=sjpa.findSucursal(hacia.getIdScursal());
            if (suc1==null){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "La sucursal con dicho id no existe"));
            }
            else{
                hacia=suc1;
            }
        }
        return "";
    }
    
    public String anadirDetalle(){
        DetallePaquete detalle=new DetallePaquete();
        detalle.setAncho(detalleAncho);
        detalle.setCantidad(detalleCantidad);
        detalle.setDescripcion(detalleDescripcion);
        detalle.setLargo(detalleLargo);
        detalle.setPeso(detallePeso);
        detalle.setProfundidad(detalleProfundidad);
        double precioCalculado=(detalleLargo*detalleAncho*detalleProfundidad)*0.000005*detallePeso*4;
        detalle.setPrecio(precioCalculado);
        detalle.setPrecioTotal(precioCalculado*detalleCantidad);
        calcularFactura();
        initDetalle();
        return "";
    }
    
    public String quitarDetalle(DetallePaquete detal){
        detalles.remove(detal);
        calcularFactura();
        return "";
    }
    
    public String calcularFactura(){
         this.subtotal=0;
         for (DetallePaquete det:detalles){
             subtotal=subtotal+det.getPrecioTotal();
         }
         this.valIVA=subtotal*0.12;
         this.total=subtotal+valIVA;
        return "";
    }
    
    public String guardar(){
        pjpa=new PaqueteJpaController();
        Paquete paquete=new Paquete();
        if (desde==null || hacia==null || emisor==null || receptor==null){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Faltan datos por completar"));
            return "";
        }
        paquete.setTrackingCode(trackingCode);
        paquete.setDesde(desde);
        paquete.setDetalles(detalles);
        paquete.setEmisor(emisor);
        paquete.setEstado("En proceso");
        paquete.setFecha(fecha);
        paquete.setHacia(hacia);
        paquete.setNumCard(numCard);
        if (this.observacion.equals("")){
            paquete.setObservaciones(null);
        }
        else{
            Observacion obs=new Observacion();
            obs.setEstado("Sin Revision");
            obs.setDescripcion(observacion);
            List<Observacion> lobs=new ArrayList<Observacion>();
            lobs.add(obs);
            paquete.setObservaciones(lobs);
        }
        paquete.setReceptor(receptor);
        paquete.setSubtotal(subtotal);
        paquete.setTipoCard(tipoCard);
        paquete.setTotal(total);
        paquete.setTotal(total);
        paquete.setValIVA(valIVA);
        Ubicacion ubicacio=new Ubicacion();
        ubicacio.setFecha(fecha);
        ubicacio.setObservación("");
        ubicacio.setSucursal(desde);
        List <Ubicacion> ubicacione=new ArrayList<Ubicacion>();
        ubicacione.add(ubicacio);
        paquete.setUbicaciones(ubicacione);
        try{
            pjpa.create(paquete);
            return "index";
        }
        catch(Exception e){
            
            e.printStackTrace();
            return "";
        }
    }
    
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public String getTrackingCode() {
        return trackingCode;
    }

    public void setTrackingCode(String trackingCode) {
        this.trackingCode = trackingCode;
    }

    public String getNumCard() {
        return numCard;
    }

    public void setNumCard(String numCard) {
        this.numCard = numCard;
    }

    public String getTipoCard() {
        return tipoCard;
    }

    public void setTipoCard(String tipoCard) {
        this.tipoCard = tipoCard;
    }

    public double getSubtotal() {
        return subtotal;
    }

    public void setSubtotal(double subtotal) {
        this.subtotal = subtotal;
    }

    public double getValIVA() {
        return valIVA;
    }

    public void setValIVA(double valIVA) {
        this.valIVA = valIVA;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public List<DetallePaquete> getDetalles() {
        return detalles;
    }

    public void setDetalles(List<DetallePaquete> detalles) {
        this.detalles = detalles;
    }

    public Ubicacion getUbicaciones() {
        return ubicaciones;
    }

    public void setUbicaciones(Ubicacion ubicaciones) {
        this.ubicaciones = ubicaciones;
    }

    public Observacion getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(Observacion observaciones) {
        this.observaciones = observaciones;
    }

    public Persona getEmisor() {
        return emisor;
    }

    public void setEmisor(Persona emisor) {
        this.emisor = emisor;
    }

    public Persona getReceptor() {
        return receptor;
    }

    public void setReceptor(Persona receptor) {
        this.receptor = receptor;
    }

    public Sucursal getDesde() {
        return desde;
    }

    public void setDesde(Sucursal desde) {
        this.desde = desde;
    }

    public Sucursal getHacia() {
        return hacia;
    }

    public void setHacia(Sucursal hacia) {
        this.hacia = hacia;
    }

    public boolean isTarjeta() {
        return tarjeta;
    }

    public void setTarjeta(boolean tarjeta) {
        this.tarjeta = tarjeta;
    }

    public String getDetalleDescripcion() {
        return detalleDescripcion;
    }

    public void setDetalleDescripcion(String detalleDescripcion) {
        this.detalleDescripcion = detalleDescripcion;
    }

    public int getDetalleCantidad() {
        return detalleCantidad;
    }

    public void setDetalleCantidad(int detalleCantidad) {
        this.detalleCantidad = detalleCantidad;
    }

    public double getDetalleLargo() {
        return detalleLargo;
    }

    public void setDetalleLargo(double detalleLargo) {
        this.detalleLargo = detalleLargo;
    }

    public double getDetalleAncho() {
        return detalleAncho;
    }

    public void setDetalleAncho(double detalleAncho) {
        this.detalleAncho = detalleAncho;
    }

    public double getDetalleProfundidad() {
        return detalleProfundidad;
    }

    public void setDetalleProfundidad(double detalleProfundidad) {
        this.detalleProfundidad = detalleProfundidad;
    }

    public double getDetallePeso() {
        return detallePeso;
    }

    public void setDetallePeso(double detallePeso) {
        this.detallePeso = detallePeso;
    }

    public double getDetallePrecio() {
        return detallePrecio;
    }

    public void setDetallePrecio(double detallePrecio) {
        this.detallePrecio = detallePrecio;
    }

    public double getDetalleTotal() {
        return detalleTotal;
    }

    public void setDetalleTotal(double detalleTotal) {
        this.detalleTotal = detalleTotal;
    }

    public String getObservacion() {
        return observacion;
    }

    public void setObservacion(String observacion) {
        this.observacion = observacion;
    }
    
    public String pagar(){ 
        pjpa=new PaqueteJpaController();
        String resp=pjpa.pagar(numCard, tipoCard);
        if(resp.equals("Pago realizado")){
            return "";
        }else{
            return "index";
        }
    }
}
